#ifndef CCAMERA_H_
#define CCAMERA_H_


/*=====================================================================
	Header Includes:
//===================================================================*/
#include "../Config.h"


class CCamera
{
private:
	
	enum Planes
	{
		PLANE_Left = 0,
		PLANE_Right,
		PLANE_Top,
		PLANE_Bottom,
		PLANE_Near,
		PLANE_Far
	};


	float m_fNear;
	float m_fFar;
	float m_fWidth;
	float m_fHeight;

	//Frustum planes
	D3DXPLANE m_frustum[6];


	D3DXMATRIX m_Projection;
	D3DXMATRIX m_View;
	
	//Field of view
	float m_fFieldofView;

public:
	static D3DXVECTOR3 s_WorldUp;


	CCamera(void);
	~CCamera(void);
	CCamera(const CCamera &);
	CCamera &operator=(const CCamera &);
	

	const D3DXMATRIX &GetProjection() { return m_Projection; }
	const D3DXMATRIX GetView();

	
	D3DXMATRIX GetViewProjection(void);
	void SetViewMatrix(D3DXMATRIX* _Matrix);
	void SetProjectionMatrix(D3DXMATRIX* _Matrix);

	
	void Initialize(float fWidth, float fHeight);
	void Update(float fDeltaTime);

	float GetNear(void){ return m_fNear; }
	void SetNear(float fnear){ m_fNear = ( fnear < 0.0f ? 0.0f : fnear ); }

	float GetFar(void){ return m_fFar; }
	void SetFar(float ffar){ m_fFar = ffar; }

	void BuildPerspective();



    
	/*=====================================================================
		View Matrix Functions
	//===================================================================*/
	D3DXVECTOR3 GetViewXAxis(void);
    void SetViewXAxis(D3DXVECTOR3 _vPosition);

	D3DXVECTOR3 GetViewYAxis(void);
    void SetViewYAxis(D3DXVECTOR3 _vPosition);

	D3DXVECTOR3 GetViewZAxis(void);
    void SetViewZAxis(D3DXVECTOR3 _vPosition);

	D3DXVECTOR3 GetViewPositionAxis(void);
    void SetViewPositionAxis(D3DXVECTOR3 _vPosition);


	/*=================================================================
        Local Transform Functions
    //===============================================================*/
    void ViewRotateLocalX(float _fAngle);
    void ViewRotateLocalY(float _fAngle);
    void ViewRotateLocalZ(float _fAngle);
    
    void ViewTranslateLocal(D3DXVECTOR3 _vAxis);
    void ViewTranslateLocalX(float _fScale);
    void ViewTranslateLocalY(float _fScale);
    void ViewTranslateLocalZ(float _fScale);

    /*=================================================================
        Global Transform Functions
    //===============================================================*/
    void ViewRotateGlobalX(float _fAngle);
    void ViewRotateGlobalY(float _fAngle);
    void ViewRotateGlobalZ(float _fAngle);

    void ViewTranslateGlobal(D3DXVECTOR3 _vAxis);
    void ViewTranslateGlobalX(float _fScale);
    void ViewTranslateGlobalY(float _fScale);
    void ViewTranslateGlobalZ(float _fScale);



};
#endif